package com.demarc.pesquisas.negocio.entidade.domicilio;

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;

import com.demarc.pesquisas.negocio.entidade.AbstractPessoaEntrevistada;

@Entity
@Table(name = "mor_morador")
@AttributeOverrides(value = {
        @AttributeOverride(name = "nome", column = @Column(name = "mor_nome", nullable = false)),
        @AttributeOverride(name = "cpf", column = @Column(name = "mor_cpf")),
        @AttributeOverride(name = "rg", column = @Column(name = "mor_rg")),
        @AttributeOverride(name = "orgaoExpedidor", column = @Column(name = "mor_orgao_expedidor")),
        @AttributeOverride(name = "carteiraTrabalho", column = @Column(name = "mor_carteira_trabalho")),
        @AttributeOverride(name = "registroNascimento", column = @Column(name = "mor_registro_nascimento")),
        @AttributeOverride(name = "certificadoReservista", column = @Column(name = "mor_certificado_reservista")),
        @AttributeOverride(name = "telefone", column = @Column(name = "mor_telefone")),
        @AttributeOverride(name = "telefoneAuxiliar", column = @Column(name = "mor_telefone_auxiliar")),
        @AttributeOverride(name = "celular", column = @Column(name = "mor_celular")),
        @AttributeOverride(name = "celularAuxiliar", column = @Column(name = "mor_celular_auxiliar")),
        @AttributeOverride(name = "ultimaAtualizacao", column = @Column(name = "mor_ultima_atualizacao")),
        @AttributeOverride(name = "usuarioAtualizacao", column = @Column(name = "mor_usuario_atualizacao"))})
public class Morador extends AbstractPessoaEntrevistada<Long> {

    private Long id;
    private Domicilio domicilio;

    @Id
    @Column(name = "mor_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = Domicilio.ID, nullable = false)
    @NotNull
    public Domicilio getDomicilio() {
        return domicilio;
    }

    public void setDomicilio(Domicilio domicilio) {
        this.domicilio = domicilio;
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder().append(super.getCpf()).toHashCode();
    }

    @Override
    public boolean equals(Object obj) {
        boolean isEquals = false;

        if (obj == this) {
            isEquals = true;
        } else if (obj instanceof Morador) {
            Morador morador = (Morador) obj;
            isEquals =
                    new EqualsBuilder().append(super.getNome(), morador.getNome())
                            .append(super.getCpf(), morador.getCpf()).isEquals();
        }
        return isEquals;
    }
}
